#ifndef BCCONSTANTWATERDEPTHVELOCITY_HPP
#define BCCONSTANTWATERDEPTHVELOCITY_HPP

#include "boundaryCondition.hpp"
#include "sweSolverTypes_fwd.hpp"
#include "coordTransformer.hpp"
#include "fieldMemberMacros.hpp"

namespace hms {

using std::experimental::observer_ptr;

template<typename MeshType>
class ConstantWaterDepth_velocity : public BoundaryCondition<MeshType>
{
public:
	using BaseType = BoundaryCondition<MeshType>;
	using Type = typename BaseType::Type;
	using BaseType::field;
	using BaseType::patch;

private:
	FieldTransformer<MeshType> m_transformer;
	scalar m_dGhost;
	scalar m_vBoundaryOrth; // limiter for supercritical flow. Not implemented.
	scalar m_vBoundaryPara;

	D_FIELD_MEMBER;

public:
	ConstantWaterDepth_velocity() = default;

	ConstantWaterDepth_velocity(
		Field<MeshType>& vField,
		const BoundaryPatch&,
		const Field<MeshType>& dField,
		scalar dGhost
	);

	virtual void update() const override;

	auto dGhost() const -> scalar;
	void dGhost(scalar);

	D_FIELD_ACCESSORS;
};

}// end namespace hms

#endif